Skip to main content

Praktisk gjennomgang – temakurs om bygging av datasett

Skriptet nedenfor demonstrerer de ulike typene datasett man kan lage, og hvordan man konverterer fra en datastruktur til en annen. Videre vises det hvordan man aggregerer data opp til høyere enhetsnivå, hvordan lage tilfeldige utvalg, og til slutt forskjellige måter å omkode variabler på.

Dette ble gjennomgått i vårt temakurs som ble kjørt to ganger i 2022. Klikk her for mer om våre kurs.

 textblock
Temakurs om bygging av datasett
-------------------------------
endblock

//Kobler til databank
require no.ssb.fdb:18 as db

textblock
A) Hvordan lage ulike typer datasett 
endblock

//Lager et vanlig wide-datasett bestående av et 1% utvalg av alle bosatte per 1/1 2018
create-dataset widedata
import db/BEFOLKNING_STATUSKODE 2018-01-01 as regstat18
keep if regstat18 == '1'
sample 0.01 333
import db/BEFOLKNING_STATUSKODE 2019-01-01 as regstat19
import db/BEFOLKNING_STATUSKODE 2020-01-01 as regstat20
import db/SIVSTANDFDT_SIVSTAND 2018-01-01 as sivstand18
import db/SIVSTANDFDT_SIVSTAND 2019-01-01 as sivstand19
import db/SIVSTANDFDT_SIVSTAND 2020-01-01 as sivstand20
import db/BEFOLKNING_KJOENN as kjønn
import db/INNTEKT_WLONN 2018-01-01 as lønn18
import db/INNTEKT_WLONN 2019-01-01 as lønn19
import db/INNTEKT_WLONN 2020-01-01 as lønn20

tabulate sivstand18, missing
tabulate sivstand19, missing
tabulate sivstand20, missing
tabulate kjønn, missing
summarize lønn18 lønn19 lønn20

//Lager et tilsvarende datasett med long-format
clone-units widedata longdata
use longdata

import-panel db/BEFOLKNING_STATUSKODE db/SIVSTANDFDT_SIVSTAND db/INNTEKT_WLONN db/BEFOLKNING_KJOENN 2018-01-01 2019-01-01 2020-01-01
rename BEFOLKNING_STATUSKODE regstat
rename SIVSTANDFDT_SIVSTAND sivstand
rename INNTEKT_WLONN lønn
rename BEFOLKNING_KJOENN kjønn

tabulate-panel sivstand, missing
tabulate-panel kjønn, missing
summarize-panel lønn

generate år = year(date@panel)
tabulate sivstand år, missing




textblock
B1) Hvordan endre datastruktur fra wide til long
endblock

use widedata

reshape-to-panel regstat sivstand lønn

//Tester om det er samsvar med opptellingene på wide-datasettet
tabulate date@panel, missing

tabulate-panel regstat, missing
tabulate-panel sivstand, missing
tabulate-panel regstat sivstand, missing

tabulate-panel kjønn, missing
tabulate-panel regstat kjønn, missing
tabulate-panel sivstand kjønn, missing

summarize lønn
summarize-panel lønn


textblock
B2) Hvordan endre datastruktur fra long til wide
endblock

reshape-from-panel
drop kjønn20
rename kjønn19 kjønn

tabulate regstat19, missing
tabulate regstat20, missing
tabulate sivstand19, missing
tabulate sivstand20, missing
tabulate kjønn, missing
summarize lønn19 lønn20

//Hvordan man gjør det når man har et longdatasett laget med import-panel
use longdata
tabulate-panel regstat, missing
tabulate-panel sivstand, missing
tabulate-panel kjønn, missing
summarize-panel lønn

reshape-from-panel
drop kjønn18262
rename kjønn17897 kjønn

rename regstat17897 regstat19
rename regstat18262 regstat20

rename sivstand17897 sivstand19
rename sivstand18262 sivstand20

rename lønn17897 lønn19
rename lønn18262 lønn20

summarize lønn19 lønn20




textblock
C) Hvordan aggregere data
endblock

//Eksempel 1: Forløpsnivå -> personnivå
//Lager en populasjon bestående av alle bosatte i Norge per 2019-01-01
create-dataset totalpop
import db/BEFOLKNING_KJOENN as kjønn
import db/BEFOLKNING_STATUSKODE 2019-01-01 as regstat
keep if regstat == '1'

//Finner personer med status som skilt i løpet av året før (2018)
create-dataset forløp
import-event db/SIVSTANDFDT_SIVSTAND 2018-01-01 to 2018-12-31 as sivilstand
keep if sivilstand == '4'
collapse (count) sivilstand, by(PERSONID_1 )
rename sivilstand ant_ganger_skilt
tabulate ant_ganger_skilt

//Kobler skilsmisseopplysninger på datasettet med alle bosatte og lager en dummy som angir status = skilt
merge ant_ganger_skilt into totalpop
use totalpop
generate skilt2018 = 0
replace skilt2018 = 1 if ant_ganger_skilt >= 1
tabulate skilt2018, cellpct
piechart skilt2018


//Eksempel 2: Personnivå -> familienivå
//Oppretter først et persondatasett for personer i familier bestående av ektepar med små barn
create-dataset persondata
import db/BEFOLKNING_REGSTAT_FAMTYP 2017-01-01 as famtype
tabulate famtype
keep if famtype == '2.1.1'

//Legger til diverse demografiske opplysninger
import db/BEFOLKNING_KJOENN as kjønn
import db/BEFOLKNING_FOEDSELS_AAR_MND as faarmnd
generate alder = 2017 - int(faarmnd/100)

import db/BEFOLKNING_KOMMNR_FAKTISK 2017-01-01 as bosted
generate fylke = substr(bosted, 1, 2)

import db/BEFOLKNING_BARN_I_HUSH 2017-01-01 as antbarn

//Oppretter datasett for generering av total yrkesinntekt per familie => enhet = familie
create-dataset familiedata
import db/BEFOLKNING_REGSTAT_FAMNR 2017-01-01 as famnr
import db/INNTEKT_WYRKINNT 2017-01-01 as yrkesinnt
collapse (sum) yrkesinnt, by(famnr)
rename yrkesinnt familieinnt

//Kobler familieinntekt på persondatasettet (enhet = personer)
merge familieinnt into persondata on PERSONID_1

//Lager familiestatistikk. Familienummeret består av person-id til eldste person i familien, så når en fjerner individer med manglende familieinntekt sitter en igjen med et datasett med familie som enhet. Alle personopplysninger vil da gjelde for eldste person i familien
use persondata
drop if sysmiss(familieinnt)

rename alder alder_eldst
rename kjønn kjønn_eldst

define-labels fylketekst '01' Østfold '02' Akershus '03' Oslo '04' Hedmark '05' Oppland '06' Buskerud '07' Vestfold '08' Telemark '09' 'Aust-Agder' '10' 'Vest-Agder' '11' Rogaland '12' Hordaland '14' 'Sogn og Fjordane' '15' 'Møre og Romsdal' '16' 'Sør-Trøndelag' '17' 'Nord-Trøndelag' '18' Nordland '19' Troms '20' Finnmark '21' Spitsbergen '25' 'Studerer i utlandet' '99' Uoppgitt
assign-labels fylke fylketekst

tabulate fylke

histogram alder_eldst, discrete
histogram antbarn, discrete percent

tabulate antbarn
tabulate antbarn, cellpct
tabulate antbarn kjønn_eldst

summarize familieinnt
barchart (mean) familieinnt, by(fylke)
barchart (mean) familieinnt, by(antbarn)
histogram familieinnt, freq
histogram familieinnt, by(antbarn) percent


//Eksempel 3: Personnivå -> kommunenivå
//Lager persondatasett
create-dataset personer
import db/BEFOLKNING_KOMMNR_FAKTISK 2019-01-01 as kommune
import db/BEFOLKNING_KJOENN as kjønn
import db/INNTEKT_WLONN 2019-01-01 as lønn
import db/INNTEKT_BER_BRFORM 2019-01-01 as formue
summarize lønn formue
histogram lønn, freq
histogram formue, freq

//Lager tall for snittlønn og snittformue per kommune og kobler på persondatasett
create-dataset kommunedata_lønn_formue
import db/BEFOLKNING_KOMMNR_FAKTISK 2019-01-01 as kommune
import db/INNTEKT_WLONN 2019-01-01 as lønn
import db/INNTEKT_BER_BRFORM 2019-01-01 as formue
collapse (mean) lønn formue, by(kommune)
rename lønn snittlønn_kommune
rename formue snittformue_kommune
summarize snittlønn_kommune snittformue_kommune
merge snittlønn_kommune snittformue_kommune into personer on kommune

//Lager tall for antall arbeidsledige og bosatte per kommune og kobler på persondatasett
create-dataset kommunedata_ledig_bosatt
import db/BEFOLKNING_KOMMNR_FAKTISK 2019-01-01 as kommune
import db/ARBSOEK2001FDT_HOVED 2019-01-01 as as_status
generate ant_ledig = 1 if as_status == '1'
generate ant_bosatt = 1
collapse (sum) ant_ledig ant_bosatt, by(kommune)
summarize ant_ledig ant_bosatt
merge ant_ledig ant_bosatt into personer on kommune

//Bruker til slutt persondatasettet til å foreta en enkelt regresjonsanalyse
use personer
generate ledig_pst = (ant_ledig / ant_bosatt) * 100

generate mann = 0
replace mann = 1 if kjønn == '1'

generate oslo = 0
replace oslo = 1 if kommune == '0301'

generate storkommune = 0
replace storkommune = 1 if ant_bosatt > 80000

generate rik_kommune = 0
replace rik_kommune = 1 if snittformue_kommune > 2000000

regress lønn mann oslo formue snittformue_kommune snittlønn_kommune ledig_pst ant_bosatt
regress lønn mann oslo formue rik_kommune snittlønn_kommune ledig_pst storkommune




textblock
D) Lage tilfeldige utvalg
endblock

//Lager datasett med alle bosatte i Norge per 1/1 2019 og trekker så ut et 10% utvalg av disse
create-dataset totalpop1
import db/BEFOLKNING_STATUSKODE 2019-01-01 as registerstatus19
keep if registerstatus19 == '1'
sample 0.1 999

//Lager datasett med alle bosatte i Norge per 1/1 2019 og trekker så ut et utvalg bestående av 5000 individer
create-dataset totalpop2
import db/BEFOLKNING_STATUSKODE 2019-01-01 as registerstatus19
keep if registerstatus19 == '1'
sample 5000 888

//Lager datasett med alle bosatte i Norge per 1/1 2019 og trekker så ut et utvalg bestående av 5000 nye individer (forskjellige fra forrige uttrekk)
create-dataset totalpop3
import db/BEFOLKNING_STATUSKODE 2019-01-01 as registerstatus19
keep if registerstatus19 == '1'
sample 5000 950




textblock
E) Ulike måter å kode/omkode variabler
endblock

//Hente ut deler av variabelkode
create-dataset demografidata1
import db/BEFOLKNING_KOMMNR_FAKTISK 2017-01-01 as bosted

//Koder om fra kommune- til fylkesnivå
generate fylke = substr(bosted, 1, 2)

//Legger til verdilabler for å navngi fylker med navn (=> penere deskriptiv output)
define-labels fylkerstring '01' Østfold '02' Akershus '03' Oslo '04' Hedmark '05' Oppland '06' Buskerud '07' Vestfold '08' Telemark '09' 'Aust-Agder' '10' 'Vest-Agder' '11' Rogaland '12' Hordaland '14' 'Sogn og Fjordane' '15' 'Møre og Romsdal' '16' 'Sør-Trøndelag' '17' 'Nord-Trøndelag' '18' Nordland '19' Troms '20' Finnmark '21' Spitsbergen '25' 'Utdanning i utlandet' '99' Uoppgitt
assign-labels fylke fylkerstring

tabulate fylke

//Hente ut deler av numeriske variabelverdier
create-dataset demografidata2
import db/BEFOLKNING_FOEDSELS_AAR_MND as faarmnd

//Beregner alder i 2020 ut i fra fødselsår 
generate alder = 2020 - int(faarmnd / 100)


//Dummy
create-dataset demografidata3
import db/BEFOLKNING_KJOENN as kjønn

//Lager en dummyvariabel som angir mann ut i fra variabelen kjønn
generate mann = 0
replace mann = 1 if kjønn == '1'

tabulate mann


//Flere kategorier
create-dataset demografidata4
import db/INNTEKT_BRUTTOFORM 2019-12-31 as formue

//Gruppere formue i 4 intervaller
generate formueint = 1
replace formueint = 2 if formue > 500000
replace formueint = 3 if formue > 1000000
replace formueint = 4 if formue > 1500000

tabulate formueint


//recode - dummy
create-dataset demografidata5
import db/BEFOLKNING_KJOENN as kjønn

destring kjønn
tabulate kjønn
recode kjønn (2 = 0)
rename kjønn mann
tabulate mann, nolabels


//recode - flere kategorier
create-dataset befolkning
import db/BEFOLKNING_STATUSKODE 2020-01-01 as statuskode
keep if statuskode == '1'

import db/BEFOLKNING_FODELAND as fødeland
tabulate fødeland

//Oppretter kopier av fødelandsvariabel for å kunne demonstrere ulike typer rekodinger, og for å kontrollere omkodingen
clone-variables fødeland -> fødeland2
clone-variables fødeland -> fødeland_orig

//Omkoder fødeland til verdensregion - bruker først destring for å gjøre formatet om til numerisk
destring fødeland
recode fødeland (111 120 138 139 140 148 155 156 159/164 = 2) (101/141 144/158 = 1) (203/393 = 3) (143 404/578 = 4) (612 684 = 5) (601/775 = 6) (802/840 = 7) (980 = 8) (990 = 9)

define-labels vregion 0 'Norge' 1 'EU/EØS' 2 'Europeiske land utenom EU' 3 'Afrika' 4 'Asia med Tyrkia' 5 'Nord-Amerika' 6 'Sør- og Mellom-Amerika' 7 'Oseania' 8 'Statsløse' 9 'Uoppgitt'
assign-labels fødeland vregion

tabulate fødeland
tabulate fødeland_orig fødeland


//Omkoder fødeland til verdensregion og lager labler i samme uttrykket
destring fødeland2
recode fødeland2 (111 120 138 139 140 148 155 156 159/164 = 2 'Europeiske land utenom EU') (101/141 144/158 = 1 'EU/EØS') (203/393 = 3 'Afrika') (143 404/578 = 4 'Asia med Tyrkia') (612 684 = 5 'Nord-Amerika') (601/775 = 6 'Sør- og Mellom-Amerika') (802/840 = 7 'Oseania') (980 = 8 'Statsløse') (990 = 9 'Uoppgitt')
tabulate fødeland2


//recode - alfanumeriske variabler
create-dataset demografidata6
import db/SIVSTANDFDT_SIVSTAND 2019-01-01 as sivilstand
tabulate sivilstand
recode sivilstand ('1' = '1')('2' = '2')(* = '3' 'Øvrig')
tabulate sivilstand